from django import forms
from django.core.exceptions import ValidationError
import hashlib
from app01 import models


class RegForm(forms.ModelForm):
    """
    注册页面的form设置
    """
    # username = forms.CharField()  # 这是普通form的写法
    re_pwd = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': '确认密码', 'type': 'password'}),
                             label='确认密码', min_length=6)  # 自定义一个form字段,修改lable字段，限制密码长度
    pass_word = forms.CharField(error_messages={'required': '这是必选项'},
                                widget=forms.PasswordInput(attrs={'placeholder': '密码', 'type': 'password'}), label='密码',
                                min_length=6)  # 覆盖自己默认定义的字段

    class Meta:  # 给该类加配置信息
        model = models.User  # 创建一个model,用models里数据库user中的字段来创建form字段
        # fields = ['user_name', 'pass_word']  # 根据哪个字段去生成
        fields = '__all__'  # 根据所有字段去生成
        exclude = ['last_time', 'is_active']  # 排除该字段
        widgets = {
            'user_name': forms.TextInput(attrs={'placeholder': '用户名'}),
            # 'company': forms.Select(),
            'position': forms.TextInput(attrs={'placeholder': '请输入职位'}),
            'phone': forms.TextInput(attrs={'placeholder': '手机号'}),
        }
        error_messages = {
            'user_name': {
                'required': '必填项'
            },
            'pass_word': {
                'required': '必填项'
            }
        }

    def clean_phone(self):  # 利用局部钩子对手机号进行校验
        import re
        phone = self.cleaned_data.get('phone')
        # 正则判断匹配
        if re.match(r'^1[3-9]\d{9}$', phone):
            return phone

        raise ValidationError('手机号格式不正确')

    def clean(self):
        self._validate_unique = True  # 数据库校验唯一性
        pass_word = self.cleaned_data.get('pass_word', '')  # 加入空字符串，防止不填判断加密报错
        re_pwd = self.cleaned_data.get('re_pwd')

        if pass_word == re_pwd:
            md5 = hashlib.md5()  # 创建MD5对象
            md5.update(pass_word.encode('utf-8'))  # 将bate数据类型的密码，编码加入MD5中
            self.cleaned_data['pass_word'] = md5.hexdigest()  # 将加密后的数据输出存入pass_word字段
            return self.cleaned_data

        self.add_error('re_pwd', '两次密码不一致')
        raise ValidationError('两次密码不一致 ')

    def __init__(self, *args, **kwargs):  # 解决公司表单下拉框首选项为“-----”现象
        super().__init__(*args, **kwargs)
        # 自定义操作
        field = self.fields['company']

        choices = field.choices
        choices[0] = ['', '选择公司']
        field.choices = choices


class ArticleForm(forms.ModelForm):
    """
    新增文章页配置form
    """

    class Meta:  # 将数据库的变量名，全部转化为form表单的名字
        model = models.Article
        fields = "__all__"
        exclude = ['detail']  # 排除掉循环字段

        # # 修改文章（方式一）
        # widgets = {
        #     'title': forms.TextInput(attrs={'class': 'form-control'}),
        #     'abstract': forms.TextInput(attrs={'class': 'form-control'})
        # }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # 做自定义操作  (给表增加样式二)
        for field in self.fields.values():  # self.fields为一个字典，循环拿取里面的字段
            field.widget.attrs['class'] = 'form-control'

    def clean(self):  # 写全局钩子
        # form_obj.save()  # 保存数据,不能全部保存，故回报错换一种方法
        # 插入文章详情
        detail = self.data.get('detail')
        detail_obj = models.ArticleDetail.objects.create(content=detail)  # 将数据存入数据库,并拿到相应对象

        # 插入文章
        self.cleaned_data['detail_id'] = detail_obj.pk  # 将存入文章详情页的pk，放入detail_id中
        # models.Article.objects.create(**form_obj.cleaned_data)

        return self.cleaned_data


class ArticleDetailForm(forms.ModelForm):
    """
    富文本编辑配置form
    """

    class Meta:  # 将数据库的变量名，全部转化为form表单的名字
        model = models.ArticleDetail
        fields = "__all__"